package day03;

import groovy.lang.GroovyShell;

import java.io.FileReader;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * GroovyShell由GroovyClassLoader进行类加载，
 * 类加载器回收的逻辑很复杂，需要类，对象都被回收掉，但是很明显shell由于是GC ROOT（类的静态成员），所以不会被回收。
 * 由于 shell.evaluate(reader);会不断产生代理类，最终导致元空间溢出。
 */
// -XX:MaxMetaspaceSize=24m
// 模拟不断生成类, 但类无法卸载的情况
public class TestOomTooManyClass {

    static GroovyShell shell = new GroovyShell();

    public static void main(String[] args) {
        AtomicInteger c = new AtomicInteger();
        while (true) {
            try (FileReader reader = new FileReader("script")) {
//                GroovyShell shell = new GroovyShell();
                shell.evaluate(reader);
                System.out.println(c.incrementAndGet());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
